package Junit;

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.stream.Stream;

public class Junit5 {
    public static Stream<Arguments> Generator() {
        return Stream.of(Arguments.arguments(1,"张三"),
                Arguments.arguments(2,"李四"),
                Arguments.arguments(3,"王五"));
    }
    // 需要添加 junit 依赖， 再maven 中央仓库中查找， 并复制粘贴进来
//    @Test
//    void Test01(){ // 不能写成 private
//        System.out.println(" 正在学习 junit,一个测试");
//        // 这样不需要创建 main 方法 就可以直接运行了
//    }


    @Test
    void Test01(){ // 不能写成 private
        System.out.println(" 正在学习 junit,一个测试");
        // 这样不需要创建 main 方法 就可以直接运行了
    }

    @Test
    void Test02(){
//        WebDriver webDriver = new ChromeDriver();
//        webDriver.get("https://www.baidu.com/");
//        webDriver.findElement(By.cssSelector(""));
    }

    @Disabled // 忽略这个测试方法， 这个测试用例就会跳过去，不执行了
    void Test03(){
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector(""));
    }

    @BeforeAll // 再所有测试用例跑之前， 先跑 beforeaLL 里面的
    static void SetUp(){
        System.out.println("这是 BeforeAll 里面的语句");
    }

    @AfterAll // 这是所有测试用例跑完之后，最后再跑的测试用例
    static void TearDown(){
        System.out.println("0000");
    }

    @BeforeEach
    void BeforeEach(){
        System.out.println("这是BE里面的方法");
    }

    @AfterEach
    void AfterEach(){
        System.out.println("这是AE里面的语句");
    }

    // 参数化操作
    // 也需要加上响应的 maven 依赖
    // 搜索 Parameterized 找到 JUnit Jupiter Params
    // 要和 Junit 的版本保持一致
   @ParameterizedTest  // 单参数操作
    @ValueSource(ints = {1,2,3}) // 传入单参数 int 类型的
    void Test04(int num){
       System.out.println(num);  // 这个测试用例将会跑三次，每一次都要获取一个参数
   }

   @ParameterizedTest // 单参数操作， 传入 字符串类型的
    @ValueSource(strings = {"1","2"})
    void Test05(String number){
       System.out.println(number);
   }

   /// CSV获取参数
   @ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
    void Test06(String name){  // 里面智能传递同等类型的参数
       System.out.println(name); // 这会把这个文件里面的数据打印出来 test01.csv
       // 这个测试用例运行几次取决于 test01.csv 这个文件里面 有 几行 数据
       // 有几行就打印多少次
       // test01.csv 这个文件必须以 .csv结尾
       // 而且文件里面必须以逗号分割
   }

   // 通过方法获取参, (以上都不能加 上 @Test)
   @ParameterizedTest
    @MethodSource("Generator")
    void Test07(int num,String name){ // 这里面可以传入不同类型的参数， 方法名自己起
       System.out.println("学号"+name+"姓名"+name);
   }

   @ParameterizedTest
    @CsvSource("1, 2, 3, ''")
    void test08(String x, String y, int z,String i){
       System.out.println(x);
       System.out.println(y);
       System.out.println(z);
       System.out.println(i);
       System.out.println("===========");
   }


}
